package stage.manager;

import java.util.ArrayList;
import java.util.List;

import stage.pojo.HistoricalInfo;
//import jsc.distributions.Exponential;


/**
 * the main logic to get the visitor number
 * should be done by lu, gan, chu
 */
public class MainLogic {
	/**
	* @return	the visitor number
	*/

	private static int sum1=0,sum2=0,i,j,n=0,doctor;
	private static double E=0,t,temps;//sum3为求和的那部分，sum4为前N个小时内人数的期望值。
    static double[]a=new double[1000];
    static double[]b=new double[1000];
    static double[]c=new double[1000];
    static double[]e=new double[1000];
    static double[]f=new double[1000];
    static double[]d=new double[1000];
   // private static int fac,m,k;
   // private static double sum3=0.0,sum4=0.0,P,ave;
    
	public static double[] getVisitorNum(List<HistoricalInfo> historicalInfos,List<HistoricalInfo> allHistoricalInfos,int weather){
		/*
		 * by remi liu
		 */
		for(i=0;i<historicalInfos.size();i++){
			System.out.println(historicalInfos.get(i));
		}
		for(i=0;i<allHistoricalInfos.size();i++){
			System.out.println(allHistoricalInfos.get(i));
		}
		/*
		 * 
		 */
		
		for(i=0;i<historicalInfos.size();i++){
			sum1=0;sum2=0;
			for(j=0;j<historicalInfos.size();j++){
			if(historicalInfos.get(j).getPatientNum().intValue()==historicalInfos.get(i).getPatientNum().intValue()){
				
				sum1++;
			}
		}
			for(j=0;j<allHistoricalInfos.size();j++){
				if(allHistoricalInfos.get(j).getPatientNum().intValue()==historicalInfos.get(i).getPatientNum().intValue()){
					sum2++;
				}
			}
		 a[i]=(double)(sum1)/(double)(sum2);//人数为Ki的、天为周j的数据数量为sum1，人数为Ki的总数据量为sum2。
		 b[i]=(double)sum2/(double)(allHistoricalInfos.size());
		 c[i]=a[i]*b[i]*7;//贝叶斯公式求概率
		//考虑天气情况对人数的影响，这部分由气象台数据和医院数据复合分析得到参数
		 if(historicalInfos.get(i).getWeather()==1){
				temps=1.0;
			}
			else if(historicalInfos.get(i).getWeather()==2)temps=0.95;
			else if(historicalInfos.get(i).getWeather()==3)temps=0.90;
			else if(historicalInfos.get(i).getWeather()==4)temps=0.85;
			else if(historicalInfos.get(i).getWeather()==5)temps=0.80;
		 e[i]=c[i]*(double)(historicalInfos.get(i).getPatientNum())/(temps);
			}
		for(i=0;i<e.length;i++){
			E+=e[i];//每一天的总人数
		}
		
		E=E*temps;
		
		//ave=E/8;//即为lameda，平均每小时到的人数
		
		//以下部分由于间隔时间分布公式太不精细，导致概率不准确，t单位不明确，有问题！！！
		/*for(t=1;t<=8;t++){
			sum4=0;
		for(k=1;k<E+1;k++){
			sum3=0;
			for(i=0;i<k;i++){
               if(i==0)fac=1;
               if(i!=0){
            	   fac=1;
				for(m=1;m<=i;m++){
					fac*=m;
				}
			}
              sum3+=Math.pow((double)(ave*t),(double)i)*Math.exp((double)(-ave*t))/fac;
		}
			P=1-sum3;//P为每一个t内每一个k的概率
			sum4+=P*k;
		}
		d[n]=sum4;n++;
		}
		f[0]=d[0];
		for(i=1;i<8;i++){
			f[i]=d[i]-d[i-1];
		}
		//以上部分有问题！！！！
		*/
		//由于上部分有问题，暂切指数分布预测到达人数:
		for(t=1.0;t<=8.0;t+=1.0){
			d[n]=E*(1.0-Math.exp((double)(-t*E/480.0)));n++;}
		f[0]=d[0];
		for(i=1;i<8;i++){
			f[i]=d[i]-d[i-1];}
		sum1=0;
		for(i=0;i<8;i++){
			sum1+=f[i];}
		f[7]=f[7]+E-sum1;
		//f[n]中记录了第1到第8个小时到达的人数
		
		if(historicalInfos.get(0).getIsExpert()==true)doctor=3;//若为专家号，则医生数目为3
		if(historicalInfos.get(0).getIsExpert()==false)doctor=4;//若为普通号，则医生数目为4
		//考虑每个小时看不完病人的情况。把没有看完的人折合到下一个小时去
		for(n=0;n<f.length;n++){
			if(n>=1&&f[n-1]*10.0/doctor-60>0){
			
				f[n]=(f[n-1]*10.0/doctor-60)/(10.0/doctor)+f[n];
			}

		}//此时的f[n]为从第1小时到第八小时候诊人数，为所求结果。

		/*
		 * by liu
		 */
		System.out.println(f[0]+","+f[1]+","+f[2]);
		return f;
	}
}
